#2021-10-27 @ Yanghuihui
#函数第二版
BoxVoiPlot1 <- function(data, variable, boxplot = TRUE, violinplot = TRUE) 
{
  if(sum(is.na(data))>=1) 
    stop("your data have 'NA' value")
  if(sum(is.null(data))>=1)
    stop("please input data")
  if(!class(data) == "data.frame") 
    stop("data input should be data.frame format.")
  if(!is.factor(data[,ncol(data)]))
    stop("the final column must be 'factor'")
  data1=data
  colnames(data)[ncol(data)]="group"
  colnames(data)[variable]="value"
  if (boxplot) {
  library(ggplot2)
  #library:加载R包，例如ggplot2包
  theme_set(theme_classic())
  #theme_set :主题设置
  #theme_classic():具有经典外观的主题，具有x和y轴线，没有网格线,类似还有theme_gray()
  #plot
  g<-ggplot(data,aes(group,value))
  #ggplot():用来构建初始绘图对象，以便之后的绘图
  #mpg为所读取的绘图数据(R自带数据示例)，
  #aes(class,cty):确定坐标数据，以所选数据中的class为x轴，cty为y轴
  p1 <-  g+geom_boxplot(varwidth = T,fill="plum")+
    labs(title = "Box plot",
         x=colnames(data1)[ncol(data)],
         y=colnames(data1)[variable])
  }
  if(violinplot) {
   p2 <-  ggplot(data, aes(x = value,y = group))+
      #data 读取数据；mapping =aes 创建映射用于绘图，设置x轴和y轴调用的数据。
      geom_violin(aes(fill = group))+
      #绘制几何对象~小提琴图，fill指填充颜色，按species不同分配填充
      #alpha调整透明度，colour调整边线颜色
      #自定义颜色+ scale_fill或colour_manual(values=c("#999999", "色号", "六位"))
      #使用RGB颜色模式
      #trim=FALSE用于不修尾
      #size设定线宽度，单位mm；group分组；
      #linetype设定线型(0 = 无线, 1 = 实线, 2 = 虚线, 3 = 点线, 4 = 点虚线, 5 = 长虚线, 6 = 双虚线)
      geom_boxplot(width=0.2)+
      #加箱图，可用width=0.2设定宽度，透明度颜色等参数同上。
      geom_jitter(aes(shape = group))+
      #加抖动图，根据species选择不同形状
      coord_flip()+ 
      #旋转+ coord_flip()；geom_line()折线图；geom_bar()柱形图；geom_dotplot()点图
      labs(title = "Violin plot",
          x=colnames(data1)[ncol(data)],
          y=colnames(data1)[variable])
  }
  if (boxplot & violinplot) { 
    library(patchwork)
    p1+p2
  } else if (boxplot) {
    p1
  } else if  (violinplot) {
    p2
  } else {
    summary(aov(value ~ group, data))
  }
}
BoxVoiPlot1(data = iris,variable = 1,boxplot = T, violinplot = T) 
#可以把data换成PlantGrowth试试
